<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /* function Person(name, age) {
      this.name = name;
      this.age = age;

      return 1
    }
    Person.prototype.do = function () {
      console.log("学习 react")
    }



    //手写new的函数
    function myNew(constr, ...arg) {
      //1.创建一个对象
      const obj = {};

      //2.调用构造函数把构造函数的this指向我们创建的对象
      const re = constr.apply(obj, arg)

      //3.把obj的隐式原型指向构造函数的原型对象
      obj.__proto__ = constr.prototype;

      //4.返回值(判断构造函数的返回值是基本类型还是引用类型)
      if (typeof re === 'object' && re !== null || typeof re === "function") {
        return re;
      } else {
        return obj
      }
    }

    const p1 = myNew(Person, "laowang", 18)
    console.log(p1, "p1"); */






    /* function Person(name,age){
      this.name = name
      this.age = age

    }

    Person.prototype.do = function(){
      console.log("学习");
    }


    function mayNew(constr,...arg){
      const obj = {}

      const re = constr.apply(obj,arg)

      obj.__proto__ = constr.prototype

      if(typeof re === 'object' && typeof re !== null || typeof re === 'function'){
        return re
      }else{
        return obj
      }

    }

    const p1 = mayNew(Person,"laowang",123,456)
    console.log(p1,"p1");
    p1.do() */





      /* //封装函数
      function Animal(name,age){
        this.name = name
        this.age = age

        // return {}
      }

      Animal.prototype.eat = function(){
        console.log("吃东西");
      }


      //手写new
      function mayNew(fn,...fly){
        //创建一个对象
        const obj = {};

        //修改传入函数的this指向为这个对象
        const re = fn.apply(obj,fly)

        //让这个对象的隐士原型指向传入函数的显示原型
        obj.__proto__ = fn.prototype;

        if(typeof re === "object" && typeof re !== null || typeof re === 'function'){
          return re
        }else{
          return obj
        }
      }

      const cat = mayNew(Animal,"汤姆",4)

      console.log(cat); */




      /* function Car(name,price){
        this.name = name
        this.price = price
      }

      Car.prototype.run = function(){
        console.log("跑的飞快");
      }


      //实现new
      function mayNew(fn,...fly){
        const obj = {}

        const re = fn.apply(obj,fly)

        obj.__proto__ = fn.prototype

        if(typeof re === "object" && typeof re != null || typeof re === 'function'){
          return re
        }else{
          return obj
        }
      }

      const car = mayNew(Car,"aodi","400K")
      console.log(car); */


      /* //构造函数
      function Animal(name,age){
        this.name = name
        this.age = age
      }

      Animal.prototype.eat = function(){
        console.log("吃东西");
      }



      function mayNew(fn,...fly){
        const obj = {};

        const re = fn.apply(obj,fly)

        obj.__proto__ = fn.prototype

        if(typeof re === "object" && typeof re !== null || typeof re === "function"){
          return re
        }else{
          return obj
        }
      }

      const dog = mayNew(Animal,"小黑",6)
      dog.eat()
      console.log(dog); */


      function Animal(name,age){
        this.name = name
        this.age = age

        return 666
      }

      Animal.prototype.run = function(){
        console.log("跑得快");
      }


      function mayNew(fn,...fly){
        const obj = {}

        const re = fn.apply(obj,fly)

        obj.__proto__ = fn.prototype;

        if(typeof re === "object" && re !== null || typeof re === "function"){
          return re
        }else{
          return obj
        }

      }



      // const p1 = new Animal("狗" ,3)
      const p1 = mayNew(Animal,"猫",2)
      console.log(p1);
      p1.run()
      












  </script>
</body>

</html>